package com.ynding.cloud.common.model.util;

import cn.hutool.core.util.StrUtil;
import com.ynding.cloud.common.model.dict.CommonEnum;
import com.ynding.cloud.common.model.dict.NameValueEnum;
import com.ynding.cloud.common.model.dict.ValueEnum;

/**
 * <p> 枚举工具类</p>
 *
 * @author ynding
 * @version 2022/2/21
 **/
public class EnumUtils {

    /**
     * 值是否存在枚举类中
     *
     * @param enums 枚举例集合
     * @param value 值
     * @param <T>   值类型
     * @return
     */
    public static <T> boolean isExist(ValueEnum<T>[] enums, T value) {
        if (value == null) {
            return false;
        }
        for (ValueEnum<T> e : enums) {
            if ((value.equals(e.getValue()))) {
                return true;
            }
        }
        return false;
    }

    /**
     * 根据值获取对应的枚举类
     *
     * @param enums 枚举例集合
     * @param value 值
     * @param <E>   枚举类型
     * @param <V>   值类型
     * @return
     */
    public static <E extends Enum<? extends ValueEnum<V>>, V> E getEnumByValue(E[] enums, V value) {
        for (E e : enums) {
            if (((ValueEnum<V>) e).getValue().equals(value)) {
                return e;
            }
        }
        return null;
    }

    /**
     * 根据名称获取值
     *
     * @param enums 枚举例集合
     * @param name  名称
     * @param <T>   值类型
     * @return
     */
    public static <T> T getValueByName(NameValueEnum<T>[] enums, String name) {
        if (StrUtil.isBlank(name)) {
            return null;
        }
        for (NameValueEnum<T> e : enums) {
            if (name.equals(e.getName())) {
                return e.getValue();
            }
        }
        return null;
    }

    /**
     * 根据 key 获取对应值
     *
     * @param enums 枚举集合
     * @param key   key值
     * @param <K>   key类型
     * @param <V>   值类型
     * @return
     */
    public static <K, V> V getValueByKey(CommonEnum<K, V>[] enums, K key) {
        if (key == null) {
            return null;
        }
        for (CommonEnum<K, V> e : enums) {
            if (e.getKey().equals(key)) {
                return e.getValue();
            }
        }

        return null;
    }


}
